package cn.tedu.emp.service;

import cn.HK.po.Emp;
import cn.HK.utils.MD5Util;
import cn.HK.utils.MapperUtil;
import cn.tedu.emp.mapper.MapperLogin;
import org.apache.commons.lang.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.data.redis.core.ValueOperations;
import org.springframework.stereotype.Service;

import java.util.concurrent.TimeUnit;

@Service
public class ServiceLogin {

    @Autowired(required = false)
    private MapperLogin mapperLogin;
    @Autowired
    private StringRedisTemplate template;



    public String doLogin(Emp emp) {
        System.out.println(template);
        /*
            1 密码加密处理
            2 数据库读取existEmp 判断存在还是不存在,不存在 返回""
            3 存在登录成功 写入key-value
            4 key特点:不同用户key不一样 同一个用户不同时间key不一样
              value 根据架构定义的userJson字符串写入redis
         */
        ValueOperations<String, String> opsForString =
                template.opsForValue();
        /*
            1 到数据库去校验,e_username e_password能不能查到一个emp
            2 emp判断是否为空
                2.1 为空,说明用户名密码不对 返回空字符串/null
            3 登录成功,将数据放到redis一份
                3.1根据用户名生成 login_username的key值来保持本次登录
                的ticket,判断他是否存在
                    * 不存在:目前是第一个使用过该账户登录的人 写2个key_value
                    * 存在:当前登录客户端不是第一个使用该账户的人,将之前的ticketOld拿出来,
                    删除,并且替换成本次的ticket
                 3.2
                 ticket:
                    唯一:不同用户 key值不同 username
                    顶替:相同用户,不同时间
                    "HK_TICKET_"+系统时间+e_username
            empJson:
                    empJson字符串,将emp对象按照读取数据
                    展示数据结构,构造json
            4.返回key值
        */
    emp.setePassword(MD5Util.md5(emp.getePassword()));
    System.out.println(emp.geteUsername()+emp.getePassword());

    Emp exist = mapperLogin.selectExistByUsernameAndPassword(emp);

    System.out.println(exist);
    //判断
    if (exist==null){
        return "";
    }else{
        String loginkey="login_"+emp.geteUsername();
        if (template.hasKey(loginkey)){
            //说明曾经有人登录过该账户
            String lastTicket=opsForString.get(loginkey);
            template.delete(lastTicket);
        }//key
        String ticket=
                "HK_TICKET_"
                +System.currentTimeMillis()
                +emp.geteUsername();
        //value
        exist.setePassword(null);
        exist.seteUsername(exist.geteName());
        //将这个exist转化为json
        try{
            String empJson =
                    MapperUtil.MP.writeValueAsString(exist);
            //存储在redis用户数据,不能是永久的 超时时间2个小时
            opsForString.set(ticket,empJson,2, TimeUnit.HOURS);
            opsForString.set(loginkey,ticket,2,TimeUnit.HOURS);
            return ticket;
        }catch (Exception e){
            e.printStackTrace();
            return "";
        }
    }
    }


    public Emp getEmpJson(String ticket) {
        //redis的key值已经获取了,ticket,从redis读取数据
        ValueOperations<String, String> opsForString =
                template.opsForValue();
        /*
            从redis 获取该ticket的剩余时间,如果小于一小时
            重新设置超时时长,login也要重新设置超时时长
         */
        //ticket HK_TICKET_+eusername+时间戳
        Long leftTime=template.getExpire(ticket,TimeUnit.MINUTES);
        String logingKey = "login_" + obtainUsername(ticket);
        if (leftTime <1000*60*60){
            //对其进行延长时间处理
            Boolean expire
                    =template.expire(ticket,2,TimeUnit.HOURS);
            if (expire){
                template.expire(logingKey,2,TimeUnit.HOURS);
            }
        }
        if (StringUtils.isEmpty(opsForString.get(ticket))){
                return null;
        }else {
            Emp emp = mapperLogin.selectExisteByeUsername(obtainUsername(ticket));
            emp.setePassword(null);
            return emp;

        }
    }

    public String obtainUsername(String ticket) {
        //string的api从ticket解析username
        //HK_TICKET_1606889472682admin
        return ticket.substring(23);
    }
}
